package com.sxj.corejava.code06_数组;

import java.util.Scanner;

/**
 * @author 石小俊
 * @date 2025年01月06日
 * 从键盘输入一个整数,控制生成的二维数组,以顺时针螺旋式的形式填充到二维数组中
 * 例如:输一个数字2,程序输出如下
 * 1	2
 * 4   3
 * 输入数字3,程序输出如下
 * 1	2	3
 * 8   9   4
 * 7   6   5
 * 输入数字4,程序输出如下
 * 1	2	3	4
 * 12	13	14  5
 * 11  16 	15  6
 * 10   9 	8	7
 */
public class Test10_螺旋式数组 {

    public static void main(String[] args) {
//        arr[y][x]
//        左 --> 右		此时x的值从小到大填充,y的值一直处于最小值,且每次填充完成之后y的最小值+1
//        上 --> 下		此时y的值从小到大填充,x的值一直处于最大值,每次填充完成之后x的最大值-1
//        右 --> 左		此时x的值从大到小填充,y的值一直处于最大值,每次填充完成之后y的最大值-1
//        下 --> 上		此时y的值从大到小填充,x的值一直处于最小值,每次填充完成之后x的最小值+1
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入每一行元素的数量:");
        int num = sc.nextInt();
        int[][] arr = new int[num][num];
        // 分别定义x轴下标的最小值、最大值以及y轴下标的最小值、最大值
        int minX = 0, maxX = num - 1, minY = 0, maxY = num - 1;
        // 定义填充的数据的初始值
        int count = 1;

        while (minX <= maxX) {
            // 左 --> 右	此时x的值从小到大填充,y的值一直处于最小值
            for (int x = minX; x <= maxX; x++) {
                arr[minY][x] = count++;
            }
            // 每次填充完成之后y的最小值+1
            minY++;

            // 上 --> 下	此时y的值从小到大填充,x的值一直处于最大值
            for (int y = minY; y <= maxY; y++) {
                arr[y][maxX] = count++;
            }
            // 每次填充完成之后x的最大值-1
            maxX--;

            // 右 --> 左	此时x的值从大到小填充,y的值一直处于最大值
            for (int x = maxX; x >= minX; x--) {
                arr[maxY][x] = count++;
            }
            // 每次填充完成之后y的最大值-1
            maxY--;

            // 下 --> 上	此时y的值从大到小填充,x的值一直处于最小值
            for (int y = maxY; y >= minY; y--) {
                arr[y][minX] = count++;
            }
            // 每次填充完成之后x的最小值+1
            minX++;
        }

        // 打印
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + "\t");
            }
            System.out.println();
        }

    }

}
